package com.hanbang.maige.utils.other;

import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.view.View;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static com.baidu.location.d.j.u;
import static com.hanbang.maige.code.MyApplication.myApp;

/**
 * 作者　　: 李坤
 * 创建时间:2016/11/2　14:01
 * 邮箱　　：496546144@qq.com
 * <p>
 * 功能介绍：复合文本的工具类
 */

public class SpannableUtils {

    /**
     * @param <T>
     */
    public interface SpanClickListener<T> {
        void onSpanClick(T t);
    }

    /**
     * 作者　　: 李坤
     * 创建时间: 2016/11/2 14:13
     * <p>
     * 方法功能：组合朋友圈评论的字符串
     *
     * @param content 评论的内容
     * @param faqi    评论的发起人
     * @param mubiao  对谁评论，为空代表没有回复人
     */
    public static SpannableString getHuiFu(int color, String content, String faqi, String mubiao, final SpanClickListener spanClickListener) throws Exception {


        StringBuilder sb = new StringBuilder();
        if (faqi != null && faqi.length() > 0) {
            sb.append(faqi);
            if (mubiao != null && mubiao.length() > 0) {
                sb.append(" 回复 ");
                sb.append(mubiao);
                sb.append(":");
                mubiao = mubiao + ":";
            } else {
                sb.append(":");
                faqi = sb.toString();
            }

        } else {
            if (mubiao != null && mubiao.length() > 0) {
                sb.append(mubiao);
                sb.append(":");
                mubiao = mubiao + ":";
            }
        }
        if (content != null) {
            sb.append(content);
        }
        SpannableString spannableString = new SpannableString(sb);

        if (faqi != null && faqi.length() > 0) {
            int faqiIndex = sb.indexOf(faqi);

            spannableString.setSpan(new ForegroundColorSpan(myApp.getResources().getColor(color)), faqiIndex, faqiIndex + faqi.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            spannableString.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View widget) {

                    spanClickListener.onSpanClick(0);
                }

                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    ds.setUnderlineText(false);
                }
            }, faqiIndex, faqiIndex + faqi.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }

        if (mubiao != null && mubiao.length() > 0) {
            int mubiaoIndex = sb.indexOf(mubiao);
            spannableString.setSpan(new ForegroundColorSpan(myApp.getResources().getColor(color)), mubiaoIndex, mubiaoIndex + mubiao.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            spannableString.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    spanClickListener.onSpanClick(1);
                }

                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    ds.setUnderlineText(false);
                }
            }, mubiaoIndex, mubiaoIndex + mubiao.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        }


        return spannableString;
    }


    /**
     * 作者　　: 李坤
     * 创建时间: 2016/11/2 14:03
     * <p>
     * 方法功能：颜色处理、点击处理
     */
    public static SpannableString getAtUserSpan(int color, String str, boolean clickable, SpanClickListener spanClickListener) throws Exception {
        SpannableString spannableString = new SpannableString(str);
        Pattern patten = Pattern.compile("@" + "", Pattern.CASE_INSENSITIVE);
        if (clickable) {
            dealClick(spannableString, patten, 0, spanClickListener, u);
        }
        dealPattern(color, spannableString, patten, 0);
        return spannableString;
    }


    /**
     * 对spanableString进行正则判断，如果符合要求，则将内容变色
     *
     * @param color
     * @param spannableString
     * @param patten
     * @param start
     * @throws Exception
     */
    private static void dealPattern(int color, SpannableString spannableString, Pattern patten, int start) throws Exception {
        Matcher matcher = patten.matcher(spannableString);
        while (matcher.find()) {
            String key = matcher.group();
            // 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归
            if (matcher.start() < start) {
                continue;
            }
            // 计算该内容的长度，也就是要替换的字符串的长度
            int end = matcher.start() + key.length();
            //设置前景色span
            spannableString.setSpan(new ForegroundColorSpan(color), matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            if (end < spannableString.length()) {
                // 如果整个字符串还未验证完，则继续。。
                dealPattern(color, spannableString, patten, end);
            }
            break;
        }
    }

    /**
     * 对spanableString进行正则判断，如果符合要求，将内容设置可点击
     *
     * @param spannableString
     * @param patten
     * @param start
     * @param spanClickListener
     * @param bean
     */
    private static void dealClick(SpannableString spannableString, Pattern patten, int start, final SpanClickListener spanClickListener, final Object bean) {
        Matcher matcher = patten.matcher(spannableString);
        while (matcher.find()) {
            String key = matcher.group();
            // 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归
            if (matcher.start() < start) {
                continue;
            }
            // 计算该内容的长度，也就是要替换的字符串的长度
            int end = matcher.start() + key.length();
            spannableString.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    spanClickListener.onSpanClick(bean);
                }

                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    //设置画笔属性
                    ds.setUnderlineText(false);//默认有下划线
                }
            }, matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            if (end < spannableString.length()) {
                // 如果整个字符串还未验证完，则继续。。
                dealClick(spannableString, patten, end, spanClickListener, bean);
            }
            break;
        }
    }
}
